package cn.yx.common.core.util;

import cn.yx.common.core.enums.RandomCodeEnum;

import java.util.concurrent.ThreadLocalRandom;

/**
 * <p>随机数和随机字符串工具类，使用ThreadLocalRandom代替Random</p>
 *
 * @author Wgssmart
 */
public final class RandomUtil {

    public static final int DEFAULT_CODE_LENGTH = 5;

    private RandomUtil() {
    }

    public static int randomInt(int max) {
        return ThreadLocalRandom.current().nextInt(max);
    }

    /**
     * 获取指定范围内的随机整数
     *
     * @param min 随机整数的最小值，必须是正整数
     * @param max 随机整数的最大值，必须是正整数，并且大于min参数
     * @return 最小值到最大值间的随机整数
     */
    public static int randomInt(int min, int max) {
        return ThreadLocalRandom.current().nextInt(max - min) + min;
    }

    /**
     * 获取指定范围内的随机整数对应的字符串，如果位数不足max最大值的位数，则前面补0
     *
     * @param min 随机整数的最小值，必须是正整数
     * @param max 随机整数的最大值，必须是正整数
     * @return 最小值到最大值间的随机整数对应的字符串，如果整数位数不足，则前面补0。如1-200，随机数为10，则返回字符串"010"
     */
    public static String randomIntStr(int min, int max) {
        int randomInt = ThreadLocalRandom.current().nextInt(max - min) + min;
        return StringUtil.addZeroPrefix(String.valueOf(randomInt), String.valueOf(max).length());
    }

    /**
     * 获取指定位数的随机整数对应的字符串，整数不足位数时，前面补0
     *
     * @param numDigit 位数
     * @return 如指定位数为7，随机数为12345，则返回字符串"0012345"
     */
    public static String randomIntStr(int numDigit) {
        int randomInt = ThreadLocalRandom.current().nextInt(MathUtil.maxInt(numDigit));
        return StringUtil.addZeroPrefix(String.valueOf(randomInt), numDigit);
    }

    /**
     * 通过指定的长度从指定字符串中获取随机验证码
     *
     * @param value      字符串
     * @param codeLength 验证码长度
     * @return 指定长度的验证码
     */
    public static String randomCode(String value, int codeLength) {
        StringBuilder code = new StringBuilder();
        char[] codeArray = value.toCharArray();
        ThreadLocalRandom random = ThreadLocalRandom.current();
        for (int i = 0; i < codeLength; i++) {
            code.append(codeArray[random.nextInt(codeArray.length)]);
        }
        return code.toString();
    }

    /**
     * 从指定字符串中获取默认长度的验证码
     *
     * @param value 字符串
     * @return 长度为5的随机验证码
     */
    public static String randomCode(String value) {
        return randomCode(value, DEFAULT_CODE_LENGTH);
    }

    /**
     * 通过指定的的验证码长度和验证码模式生成验证码
     *
     * @param randomCodeEnum 验证码模式，包括纯数字，纯字母，数字字母混合
     * @param codeLength     验证码长度
     * @return 指定长度和模式的验证码
     */
    public static String randomCode(RandomCodeEnum randomCodeEnum, int codeLength) {
        return randomCode(randomCodeEnum.getValue(), codeLength);
    }

    /**
     * 通过指定验证码模式生成验证码，使用默认长度
     *
     * @param randomCodeEnum 验证码模式
     * @return 长度为5的指定验证码模式的验证码
     */
    public static String randomCode(RandomCodeEnum randomCodeEnum) {
        return randomCode(randomCodeEnum, DEFAULT_CODE_LENGTH);
    }

}